package com.starry.compose_study.state.four

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import com.starry.compose_study.state.one.TodoItem

/**
 * 状态容器
 */
class TodoViewModel : ViewModel() {


    //设置TodoItem集合只读，注意这里没有再使用remember，因为viewModel可以保存状态
    //只要进程没有杀死，都会保存在内存中
    var todoItems = mutableStateListOf<TodoItem>()
        private set

    //当前正在编辑的todoItem的索引
    private var currentEditPosition by mutableIntStateOf(-1)

    //当前正在编辑的todoItem对象
    val currentEditItem: TodoItem?
        get() = todoItems.getOrNull(currentEditPosition)//如果currentEditPosition为-1，则返回一个空

    //添加
    fun addItem(item: TodoItem) {
        todoItems.add(item)
    }

    //删除
    fun removeItem(item: TodoItem) {
        todoItems.remove(item)
        onEditDone()
    }

    fun onEditDone() {
        currentEditPosition = -1
    }

    //当TodoItem列表中的条目被选中时，传入该对象，获取它在列表中的索引
    fun onEditItemSelected(item: TodoItem) {
        currentEditPosition = todoItems.indexOf(item)
    }

    //TodoItem编辑完成，重新给集合中的TodoItem赋值
    //id属性值不能修改，进行校验
    fun onEditItemChange(item: TodoItem) {
        val currentItem = requireNotNull(currentEditItem)
        require(currentItem.id == item.id) {
            "you can only change an item with the same id as currentEditItem"
        }
        todoItems[currentEditPosition] = item
    }
}